package com.guli.eduService.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.guli.commonUtils.R;
import com.guli.eduService.client.service_vod.VodClient;
import com.guli.eduService.entity.EduVideo;
import com.guli.eduService.entity.vo.VideoFormInfo;
import com.guli.eduService.mapper.EduVideoMapper;
import com.guli.eduService.service.EduVideoService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.guli.serviceBase.Entity.GuliExcepiton;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

import java.util.ArrayList;
import java.util.List;

/**
 * <p>
 * 课程视频 服务实现类
 * </p>
 *
 * @author zxc
 * @since 2023-04-03
 */
@Service
public class EduVideoServiceImpl extends ServiceImpl<EduVideoMapper, EduVideo> implements EduVideoService {

    // 注入vodClient :
    @Autowired
    private VodClient vodClient;

    // 具体实现，保存课程基本信息方法
    @Override
    public boolean savaVideoData(VideoFormInfo videoFormInfo) {
        // 1.新建EduVideo对象，用来存储前端所传递过来的课时基本信息;
        EduVideo eduVideo = new EduVideo();
        // 2.课时表单数据VideoFormInfo，数据传递到实体类EduVideo对象
        BeanUtils.copyProperties(videoFormInfo , eduVideo);
        boolean flag = this.save(eduVideo);
        // 3.判断课时基本信息是否保存成功
        if(!flag){
            throw new GuliExcepiton(20001 , "添加课时基本信息失败！！！");
        }
        return flag;
    }
    // 具体实现，更新课时基本信息方法
    @Override
    public boolean updateVideoData(VideoFormInfo videoFormInfo) {
        // 1.新建EduVideo对象，用来存储前端所传递过来的课时基本信息;
        EduVideo eduVideo = new EduVideo();
        // 2.课时表单数据VideoFormInfo，数据传递到实体类EduVideo对象
        BeanUtils.copyProperties(videoFormInfo , eduVideo);
        boolean flag = this.updateById(eduVideo);
        // 3.判断课时基本信息是否修改成功
        if(!flag){
            throw new GuliExcepiton(20002 , "修改课时基本信息失败！！！");
        }
        return flag;
    }
    // 具体实现，根据id查询指定的课时基本信息方法
    @Override
    public VideoFormInfo queryVideoData(String videoId) {
        // 1.根据所传递的videoId值，来获取指定的课时基本信息
        EduVideo eduVideo = this.getById(videoId);
        // 2.判断是否能够根据前端所传递的videoId值，来获取到课时基本信息;
        if(eduVideo == null){
            throw new GuliExcepiton(20003 , "所查询课时不存在！！！");
        }
        // 3.实体类EduVideo对象，数据传递到课时表单数据VideoFormInfo
        VideoFormInfo videoFormInfo = new VideoFormInfo();
        BeanUtils.copyProperties(eduVideo , videoFormInfo);
        return videoFormInfo;
    }

    // 具体实现 ：根据课时id,删除指定的课时基本信息方法
    @Override
    public boolean deleteVideoData(String videoId) {
        // 删除该video所对应的音视频资源;
        // 1.根据QueryWrapper对象，取查询对应课时基本信息;
        EduVideo videoInfo = this.getById(videoId);
        // 根据所查询到的EduVideo对象中所存储的videoSourceId，来对于该课时所对应的音视频进行删除;
        String videoSourceId = videoInfo.getVideoSourceId();
        // 即，若是当前课时信息中不存在videoSourceId的话中，就说明当前课时信息中不包含音视频，也就没有必要去进行删除;
        if(!StringUtils.isEmpty(videoSourceId)){
            R result = vodClient.deleteVideoVod(videoSourceId);
            if(result.getCode() == 20001){
                throw new GuliExcepiton(20001 , "删除该指定的音视频资源失败!!!");
            }
        }
        // 2.移除该video在edu_video数据中的数据;
        boolean flag = this.removeById(videoId);
        if(!flag){
            throw new GuliExcepiton(20004 , "删除课时基本信息失败！！！");
        }
        return flag;
    }

    /**
     * 具体实现 ：根据课程id，删除指定的课时信息;
     * @param courseId
     * @return
     */
    @Override
    public boolean removeByCourseId(String courseId) {
        // 1.封装查询条件（根据课程id，来查询课时基本信息）
        // 删除当前课程下的所有音视频资源，即当前课程下所要删除的音视频资源是不止一个的（若干个音视频资源，需要被删除）
        QueryWrapper<EduVideo> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("course_id" , courseId);
        // 即，所获取到符合查询条件的EduVideo对象中，有且仅有一个字段video_source_id;
        queryWrapper.select("video_source_id");

        // 2.根据QueryWrapper对象，查询到 所有符合条件的课时基本信息;
        List<EduVideo> videoList = this.list(queryWrapper);
        // （1）将所查询到的EduVideo对象集合，转化为String类型的videoId集合;
        List<String> videoSourceIdList = new ArrayList<>();
        for (EduVideo video : videoList) {
            // 遍历所查询到的所有video对象，若是该video对象的videoSourceId不为空，则将其加入到videoIdList集合中;
            String videoSourceId = video.getVideoSourceId();
            if(!StringUtils.isEmpty(videoSourceId)){
                videoSourceIdList.add(videoSourceId);
            }
        }

        // 3.根据所查询到的videoSourceId集合，删除对应的视频资源
        if(!videoSourceIdList.isEmpty()){
            // 即，当videoSourceIdList不为空的话，才根据该音视频id的集合，去删除指定的所有音视频;
            vodClient.deleteVideoVodByIds(videoSourceIdList);
        }

        // 4.根据QueryWrapper对象，来删除指定的课时基本信息
        QueryWrapper<EduVideo> queryWrapper1 = new QueryWrapper<>();
        queryWrapper1.eq("course_id" , courseId);
        boolean isDeletedVideoInfo = this.remove(queryWrapper1);
        // 课时基本信息删除失败的情况 ：
        if(!isDeletedVideoInfo) {
            throw new GuliExcepiton(20005, "删除该课时信息失败！！！");
        }
        return true;
    }
}
